home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_02_07 / 2n07024a < prev    next >
Text File  |  1991-05-14  |  5KB  |  214 lines

  1.  
  2. (*
  3.     File:           TryEms.Pas;
  4.     Description:    A Test Bed for a TEmsStream Object.
  5.     Compiler:       Turbo Pascal V.6.0
  6.     Date:           3/6/91;
  7.     Author:         Michael Kelly;
  8.  
  9.     Comments:       A TEmsStream provides Stream I/O
  10.                     for Expanded Memory Specification
  11.                     3.2 and 4.0 type memory.
  12.  
  13.                     The TEmsStream interface eliminates
  14.                     the book-keeping that would be
  15.                     required if calls to Interrupt $67
  16.                     ( the Ems Interrupt ) were made
  17.                     directly.
  18.  
  19.                     This program was debugged using
  20.                     the AboveDisk+ Expanded Memory
  21.                     Manager on an XT Clone using
  22.                     disk space to emulate expanded
  23.                     memory.
  24.  
  25.     Copyright:      Put in the Public Domain by
  26.                     the Author.
  27.  
  28.                     $$$   Warning  $$$
  29.  
  30.                     Error recovery should include calling
  31.                     the TEmsStream destructor ( Done ) if
  32.                     at all possible, otherwise the user
  33.                     will have to reboot the machine to
  34.                     reclaim any memory allocated from Ems.
  35.  
  36. *)
  37.  
  38.  
  39. Program TryEms;
  40. Uses Objects, Dos;
  41.  
  42.      (*
  43.       *  minimum and maximum Ems Memory to
  44.       *  allocate to the TEmsStream.
  45.       *)
  46.     Const
  47.          MinEmsMem: LongInt = 64 * 1024;
  48.          MaxEmsMem: LongInt = 256 * 1024;
  49.  
  50.     var
  51.        MyStream : TEmsStream; { The Ems Stream }
  52.  
  53.  
  54. (*
  55.  *  Reads an open file of type "text" a line at
  56.  *  a time, and writes each line to the Ems
  57.  *  Stream "MyStream" using the WriteStr method
  58.  *  inherited from TStream.
  59.  *
  60.  *  returns:  False on error, True otherwise.
  61.  *)
  62. function LoadFileInEms(var TextFile: text) : Boolean;
  63.     var
  64.        file_line: String;
  65.        len      : Word;
  66.  
  67. begin
  68.   while (not Eof(TextFile)) and
  69.         (MyStream.GetSize < MaxEmsMem) do
  70.   begin
  71.     ReadLn(TextFile, file_line);
  72.     if IOResult <> 0 then
  73.     begin
  74.       LoadFileInEms := False;
  75.       close(TextFile);
  76.       exit;
  77.     end;
  78.     len := Length(file_line) + 1;
  79.     if (MyStream.GetSize + len) > MaxEmsMem then
  80.     begin
  81.       LoadFileInEms := False;
  82.       close(TextFile);
  83.       exit;
  84.     end
  85.     else
  86.     begin
  87.       MyStream.WriteStr(@file_line);
  88.       if MyStream.Status <> stOk then
  89.       begin
  90.     LoadFileInEms := False;
  91.     close(TextFile);
  92.     exit;
  93.       end;
  94.     end;
  95.   end;
  96.   LoadFileInEms := True;
  97.   close(TextFile);
  98. end;
  99.     (* LoadFileInEms *)
  100.  
  101. (*
  102.  *  Opens text file entered on the command line
  103.  *  and calls LoadFileInEms to read the file
  104.  *  and write it on the TEmsStream.
  105.  *
  106.  *  returns:  False on error, True otherwise.
  107.  *)
  108. function ReadFile(file_name: String) : Boolean;
  109.     var
  110.        FileVar: Text;
  111.  
  112. begin
  113.  
  114.   {$I-}  Assign(FileVar, file_name);
  115.   Reset(FileVar);            {$I+}
  116.   if IOResult <> 0 then
  117.   begin
  118.     ReadFile := False;
  119.     exit;
  120.   end;
  121.   {$I-}  ReadFile := LoadFileInEms(FileVar); {$I+}
  122. end;
  123.     (* ReadFile *)
  124.  
  125. (*
  126.  *  Seeks to the start of the TEmsStream "MyStream"
  127.  *  and alternately reads a string from the stream
  128.  *  and writes it to the screen.  First a byte is
  129.  *  read from the TEmsStream into the length byte
  130.  *  of the string, then that number of bytes is
  131.  *  read into the string at index 1, completing
  132.  *  the string.  The string is then output to
  133.  *  the screen using WriteLn.
  134.  *)
  135. procedure DisplayEms;
  136.     var
  137.        str : String;
  138.  
  139. begin
  140.   MyStream.Seek(0);
  141.   if MyStream.Status <> stOK then
  142.     exit;
  143.   WriteLn;
  144.   WriteLn;
  145.   WriteLn('File Contexts  ...');
  146.   WriteLn;
  147.   while MyStream.GetPos < MyStream.GetSize do
  148.   begin
  149.     MyStream.Read(str[0], 1);
  150.     MyStream.Read(str[1], Word(Byte(str[0])));
  151.     if MyStream.Status <> stOK then
  152.       exit;
  153.     WriteLn(str);
  154.   end;
  155. end;
  156.     (* DisplayEms *)
  157.  
  158. (*
  159.  *  When debugging, it's easy to reset the program
  160.  *  and then realize EMS is allocated (that's why
  161.  *  they call it oops!).  When this happens, put
  162.  *  lines like the following at the start of the
  163.  *  main program body: FreeEmsHandle(1);
  164.  *                     FreeEmsHandle(2);
  165.  *                     ....
  166.  *                     ....
  167.  *                     Halt;
  168.  *
  169.  *  re-compile and run.
  170.  *
  171.  *  call FreeEmsHandle as many times as needed
  172.  *  to free EMS memory without rebooting, then
  173.  *  delete the lines and re-compile.  Kinda Kludgy
  174.  *  but better'n rebootin'.
  175.  *)
  176. procedure FreeEmsHandle(handle: Word);
  177. var
  178.    R:Registers;
  179.  
  180. begin
  181.      R.AH := $45;
  182.      R.DX := handle;
  183.      Intr($67, R);
  184. end;
  185.  
  186.         {  Main  }
  187. begin
  188.   if ParamCount < 1 then
  189.   begin
  190.     WriteLn('Usage: TryEms text_file');
  191.     halt;
  192.   end;
  193.   MyStream.Init(MinEmsMem, MaxEmsMem);
  194.   if MyStream.Status <> stOk then
  195.   begin
  196.     WriteLn('Could not open Ems Stream');
  197.     Halt;
  198.   end;
  199.   if (not ReadFile(ParamStr(1))) then
  200.   begin
  201.     WriteLn;
  202.     Write('Error Reading File ');
  203.     WriteLn(ParamStr(1));
  204.     if MyStream.Status <> stOK then
  205.       MyStream.Reset;
  206.     MyStream.Done;
  207.     halt;
  208.   end;
  209.   DisplayEms;
  210.   if MyStream.Status <> stOK then
  211.     MyStream.Reset;
  212.   MyStream.Done;
  213. end.
  214.